/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package algoritmos_busqueda;

/**
 *
 * @author stbn
 */

import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import javax.swing.JButton;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyAdapter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
import javax.swing.JPanel;
import java.awt.Dimension;
import javax.swing.JSlider;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.JFileChooser;
import java.io.File;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;

public class Ventana extends JFrame {
    
    private int numerocuadrados = 0; //tablero cuadrado, solo hace falta un numero
    private JLabel barraEstado;
    private JButton botonprueba;
    private GridLayout cuadricula;
    private GridLayout cuadriculaAlgoritmos;
    static int dificultadactual=0;
    private JPanel panelBotones;
    public static int velocidadPersonaje = 50;
    public static int velocidadPersonajetemp=0;    
    private int estadobotonPausa=0;
    private int algoritmoSeleccionado = 1;
    private JButton botonPausa;
    private JButton botonBS;
    private JButton botonAS;
    private JButton botonLP;
    private JButton botonBLP;
    private JPanel panelInferior;
    private JPanel panelAlgoritmos;
    private JSlider sliderVelocidadPersonaje;
    private JButton botonEjecutar;
    private JButton botonLimpiar;
    private Mapa mapa;




    public Ventana()
    {
        super("Desarroyo de algoritmos de busqueda");

        cuadricula = new GridLayout (25,25);
        

        JMenu menuArchivo = new JMenu ("Archivo");
        JMenuItem elementoEstablecerAmplitud = new JMenuItem ("Establecer amplitud campo");
        //menuArchivo.add(elementoEstablecerAmplitud);
        JMenu menuAyuda = new JMenu("Ayuda");
        JMenuItem comoUsar = new JMenuItem ("Como usar?");
        menuAyuda.add(comoUsar);
        JMenuItem guardarMapa =    new JMenuItem("Guardar mapa");
        menuArchivo.add(guardarMapa);
        JMenuItem abrirMapa = new JMenuItem("Abrir mapa");
        menuArchivo.add(abrirMapa);

        abrirMapa.addActionListener(
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent evento)
                    {
                        JFileChooser abrirArchivos = new JFileChooser();
                        abrirArchivos.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                        int resultado = abrirArchivos.showOpenDialog(Ventana.this);

                        if (resultado == JFileChooser.CANCEL_OPTION) System.exit(1);
                        File nombreArchivo = abrirArchivos.getSelectedFile();
                        //JOptionPane.showMessageDialog(null, nombreArchivo.getName());
                        ObjectInputStream entrada = null;
                        FileInputStream streamEntrada = null;
                        try
                        {
                            streamEntrada = new FileInputStream(nombreArchivo.getPath());
                            entrada = new ObjectInputStream(streamEntrada);
                            
                            //mapa = new Mapa(25);
                            Mapa mapaCopia = (Mapa) entrada.readObject();
                            
                            //panelBotones.removeAll();
                            for(int a=0;a<25;a++)
                            {
                                for (int b=0;b<25;b++)
                                {
                                    //mapa.metercuadrado(new Cuadrado(b,a));
                                    mapa.actualizarPropiedades(mapaCopia.obtenercuadrado(b, a), mapa.obtenercuadrado(b, a));
                                    //mapa.obtenercuadrado(b, a).repaint();
                                    //panelBotones.add(mapa.obtenercuadrado(b, a));
                                    }

                            }
                            panelBotones.repaint();
                            entrada.close();
                            streamEntrada.close();
                            
                            
                        }
                        catch (IOException e)
                        {
                            JOptionPane.showMessageDialog(null, "Error abriendo el archivo");
                        }
                        catch (ClassNotFoundException e)
                        {
                            JOptionPane.showMessageDialog(null, "Error abriendo el archivo");
                        }
                    }
                }
        );

        guardarMapa.addActionListener(
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent evento)
                    {
                        JFileChooser guardarArchivos = new JFileChooser();
                        guardarArchivos.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                        int resultado = guardarArchivos.showSaveDialog(Ventana.this);

                        if (resultado != JFileChooser.CANCEL_OPTION) //System.exit(1); <- No se quiere salir
                        {
                        File nombreArchivo = guardarArchivos.getSelectedFile();
                        //JOptionPane.showMessageDialog(null, nombreArchivo.getName());
                        ObjectOutputStream salida = null;
                        FileOutputStream streamSalida = null;
                        try
                        {
                            streamSalida =new FileOutputStream(nombreArchivo.getPath());
                            salida = new ObjectOutputStream(streamSalida);
                            salida.writeObject(mapa);
                        }
                        catch (IOException e)
                        {
                            JOptionPane.showMessageDialog(null, "Error guardando el archivo");                            
                        }
                        }
                    }
                }
        );


        comoUsar.addActionListener(
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent evento)
                    {
                        JOptionPane.showMessageDialog(null, "Presionar teclas 0 1 2 3 y hacer click para establecer elementos en el mapa. \n"
                                + "Una vez establecido un origen y un destino, ejecutar la busqueda. \n"
                                + "La velocidad de busqueda se puede ajustar con el slider. \n"
                                + "El algoritmo de busqueda se selecciona con los dos botones de la derecha BS = Busqueda Simple, AS = A Star");
                    }
                }
        );

        elementoEstablecerAmplitud.addActionListener(
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent evento)
                    {
                        numerocuadrados = Integer.parseInt(JOptionPane.showInputDialog("Introduce el numero de cuadrados el tablero"));
                        barraEstado.setText(String.format("Campo de %d cuadrados", numerocuadrados));
                        cuadricula.setColumns(numerocuadrados);
                        cuadricula.setRows(numerocuadrados);

                    }
                }
        );

        JMenuBar barraMenu = new JMenuBar();
        setJMenuBar(barraMenu);
        barraMenu.add(menuArchivo);
        barraMenu.add(menuAyuda);

        barraEstado = new JLabel("Barra Informacion");

        //add(barraEstado,BorderLayout.SOUTH);

        /*
        Icon iconoprueba = new ImageIcon(getClass().getResource("cuadrado0.gif"));
        botonprueba = new JButton(iconoprueba);
        add(botonprueba);
        */

        /*Cuadrado cuadrado = new Cuadrado();
        add(cuadrado);*/
        

        /*addKeyListener(
                new KeyAdapter()
                {
                    public void  keyTyped(KeyEvent evento)
                    {                        
                        barraEstado.setText("funciona");
                    }
                    public void  keyPressed(KeyEvent evento)
                    {
                        barraEstado.setText("funciona");
                    }
                    public void  keyReleased(KeyEvent evento)
                    {
                        barraEstado.setText("funciona");
                    }
                }
            );*/

        panelBotones = new JPanel();
        panelBotones.setLayout(cuadricula);

        mapa = new Mapa(25);

        //Las posiciones del mapa van de 0 a 24
        for(int a=0;a<25;a++)
        {
            for (int b=0;b<25;b++)
            {
                mapa.metercuadrado(new Cuadrado(b,a));

                panelBotones.add(mapa.obtenercuadrado(b, a));
            }

        }
       
        
        


        add(panelBotones);


        botonPausa = new JButton ("Pausa");
        botonPausa.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        switch(estadobotonPausa)
                        {
                            case 1: velocidadPersonaje = velocidadPersonajetemp; break;
                            case 0: velocidadPersonajetemp = velocidadPersonaje;
                                    velocidadPersonaje = 0;
                                    break;
                        }
                        if(estadobotonPausa==0)
                            estadobotonPausa=1;
                        else
                            estadobotonPausa=0;
                     }
                }
            );

            
            

            sliderVelocidadPersonaje = new JSlider();
            
            sliderVelocidadPersonaje.addChangeListener(
                    new ChangeListener()
                    {
                        public void stateChanged(ChangeEvent evento)
                        {
                            velocidadPersonaje = sliderVelocidadPersonaje.getValue();
                            barraEstado.setText(String.format("Valor velocidad: %d", velocidadPersonaje));

                        }
                    }
                    );

            botonEjecutar = new JButton("Ejecutar");
           
            botonEjecutar.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        switch (algoritmoSeleccionado)
                        {
                            default:
                            {
                                BusquedaSimple busqueda = new BusquedaSimple(mapa);
                                //BusquedaLPAStar busqueda = new BusquedaLPAStar(mapa);
                                busqueda.start();
                            }
                            break;

                            case 1:
                            {
                                BusquedaSimple busqueda = new BusquedaSimple(mapa);
                                busqueda.start();
                            }
                            break;

                            case 2:
                            {
                                BusquedaAStar busqueda = new BusquedaAStar(mapa);
                                busqueda.start();
                            }
                            break;

                            case 3:
                            {
                                BusquedaLPAStar busqueda = new BusquedaLPAStar(mapa);
                                busqueda.start();
                            }
                            break;

                            case 4:
                            {
                                BusquedaBackwardLPAStar busqueda = new BusquedaBackwardLPAStar(mapa);
                                busqueda.start();
                            }

                        }
                     }
                }
            );

            botonLimpiar = new JButton("Limpiar");
            
            botonLimpiar.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        //JOptionPane.showMessageDialog(null, String.format("Posicion %d %d", posx, posy));
                        mapa.limpiar();
                        //busqueda.dibujarcamino();
                     }
                }
            );



            panelInferior = new JPanel();
            panelInferior.add(barraEstado);
            panelInferior.add(sliderVelocidadPersonaje);
            panelInferior.add(botonEjecutar);
            panelInferior.add(botonPausa);
            panelInferior.add(botonLimpiar);
            
            add(panelInferior,BorderLayout.SOUTH);

            panelAlgoritmos = new JPanel();

            cuadriculaAlgoritmos = new GridLayout(4,1);
            cuadriculaAlgoritmos.setHgap(700);
            panelAlgoritmos.setLayout(cuadriculaAlgoritmos);

            botonBS = new JButton("BS");
            botonAS = new JButton("AS");
            botonLP = new JButton("LP");
            botonBLP = new JButton("BLP");

            botonBS.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        algoritmoSeleccionado = 1;
                     }
                }
            );
            

            botonAS.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        algoritmoSeleccionado = 2;
                     }
                }
            );

            botonLP.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        algoritmoSeleccionado = 3;
                     }
                }
            );

            botonBLP.addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        algoritmoSeleccionado = 4;
                     }
                }
            );

            panelAlgoritmos.add(botonBS);
            panelAlgoritmos.add(botonAS);
            panelAlgoritmos.add(botonLP);
            panelAlgoritmos.add(botonBLP);


            add(panelAlgoritmos,BorderLayout.EAST);
            




            

            
            


  }



    
    

}
